Code coverage report for src/html-behavior.js

Statements: 33.33% (59 / 177)      Branches: 8.55% (10 / 117)      Functions: 62.5% (15 / 24)      Lines: 33.14% (58 / 175)      Ignored: none     

All files » src/ » html-behavior.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 3491     1   4   1   1   1   1   6   2   1   1   1   1     1 1 1   1 1 4   4 4 4 4 4 4 4 4 4 4 4 4     1                               1 2               2 2   2 2 2 2 2 2 2 2       2 2   2               2   2   2 2                                               1                                                       1                   1                                                                                                                                                     1                                                                                                                                                               1                                     1     1        
System.register(['aurelia-metadata', 'aurelia-binding', 'aurelia-task-queue', './view-strategy', './view-engine', './content-selector', './util', './bindable-property', './behavior-instance'], function (_export) {
  'use strict';
 
  var Origin, ObserverLocator, TaskQueue, ViewStrategy, ViewEngine, ContentSelector, hyphenate, BindableProperty, BehaviorInstance, defaultInstruction, contentSelectorFactoryOptions, hasShadowDOM, HtmlBehaviorResource;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  return {
    setters: [function (_aureliaMetadata) {
      Origin = _aureliaMetadata.Origin;
    }, function (_aureliaBinding) {
      ObserverLocator = _aureliaBinding.ObserverLocator;
    }, function (_aureliaTaskQueue) {
      TaskQueue = _aureliaTaskQueue.TaskQueue;
    }, function (_viewStrategy) {
      ViewStrategy = _viewStrategy.ViewStrategy;
    }, function (_viewEngine) {
      ViewEngine = _viewEngine.ViewEngine;
    }, function (_contentSelector) {
      ContentSelector = _contentSelector.ContentSelector;
    }, function (_util) {
      hyphenate = _util.hyphenate;
    }, function (_bindableProperty) {
      BindableProperty = _bindableProperty.BindableProperty;
    }, function (_behaviorInstance) {
      BehaviorInstance = _behaviorInstance.BehaviorInstance;
    }],
    execute: function () {
      defaultInstruction = { suppressBind: false };
      contentSelectorFactoryOptions = { suppressBind: true };
      hasShadowDOM = !!HTMLElement.prototype.createShadowRoot;
 
      HtmlBehaviorResource = (function () {
        function HtmlBehaviorResource() {
          _classCallCheck(this, HtmlBehaviorResource);
 
          this.elementName = null;
          this.attributeName = null;
          this.attributeDefaultBindingMode = undefined;
          this.liftsContent = false;
          this.targetShadowDOM = false;
          this.skipContentProcessing = false;
          this.usesShadowDOM = false;
          this.childExpression = null;
          this.hasDynamicOptions = false;
          this.containerless = false;
          this.properties = [];
          this.attributes = {};
        }
 
        HtmlBehaviorResource.convention = function convention(name, existing) {
          var behavior;
 
          if (name.endsWith('CustomAttribute')) {
            behavior = existing || new HtmlBehaviorResource();
            behavior.attributeName = hyphenate(name.substring(0, name.length - 15));
          }
 
          if (name.endsWith('CustomElement')) {
            behavior = existing || new HtmlBehaviorResource();
            behavior.elementName = hyphenate(name.substring(0, name.length - 13));
          }
 
          return behavior;
        };
 
        HtmlBehaviorResource.prototype.analyze = function analyze(container, target) {
          var proto = target.prototype,
              properties = this.properties,
              attributeName = this.attributeName,
              attributeDefaultBindingMode = this.attributeDefaultBindingMode,
              i,
              ii,
              current;
 
          this.observerLocator = container.get(ObserverLocator);
          this.taskQueue = container.get(TaskQueue);
 
          this.target = target;
          this.usesShadowDOM = this.targetShadowDOM && hasShadowDOM;
          this.handlesCreated = 'created' in proto;
          this.handlesBind = 'bind' in proto;
          this.handlesUnbind = 'unbind' in proto;
          this.handlesAttached = 'attached' in proto;
          this.handlesDetached = 'detached' in proto;
          this.apiName = (this.elementName || this.attributeName).replace(/-([a-z])/g, function (m, w) {
            return w.toUpperCase();
          });
 
          Eif (attributeName !== null) {
            Eif (properties.length === 0) {
              //default for custom attributes
              new BindableProperty({
                name: 'value',
                changeHandler: 'valueChanged' in proto ? 'valueChanged' : null,
                attribute: attributeName,
                defaultBindingMode: attributeDefaultBindingMode
              }).registerWith(target, this);
            }
 
            current = properties[0];
 
            Eif (properties.length === 1 && current.name === 'value') {
              //default for custom attributes
              current.isDynamic = current.hasOptions = this.hasDynamicOptions;
              current.defineOn(target, this);
            } else {
              //custom attribute with options
              for (i = 0, ii = properties.length; i < ii; ++i) {
                properties[i].defineOn(target, this);
              }
 
              current = new BindableProperty({
                name: 'value',
                changeHandler: 'valueChanged' in proto ? 'valueChanged' : null,
                attribute: attributeName,
                defaultBindingMode: attributeDefaultBindingMode
              });
 
              current.hasOptions = true;
              current.registerWith(target, this);
            }
          } else {
            for (i = 0, ii = properties.length; i < ii; ++i) {
              properties[i].defineOn(target, this);
            }
          }
        };
 
        HtmlBehaviorResource.prototype.load = function load(container, target, viewStrategy, transientView) {
          var _this = this;
 
          var options;
 
          if (this.elementName !== null) {
            viewStrategy = viewStrategy || this.viewStrategy || ViewStrategy.getDefault(target);
            options = {
              targetShadowDOM: this.targetShadowDOM,
              beforeCompile: target.beforeCompile
            };
 
            if (!viewStrategy.moduleId) {
              viewStrategy.moduleId = Origin.get(target).moduleId;
            }
 
            return viewStrategy.loadViewFactory(container.get(ViewEngine), options).then(function (viewFactory) {
              if (!transientView) {
                _this.viewFactory = viewFactory;
              }
 
              return viewFactory;
            });
          }
 
          return Promise.resolve(this);
        };
 
        HtmlBehaviorResource.prototype.register = function register(registry, name) {
          if (this.attributeName !== null) {
            registry.registerAttribute(name || this.attributeName, this, this.attributeName);
          }
 
          if (this.elementName !== null) {
            registry.registerElement(name || this.elementName, this);
          }
        };
 
        HtmlBehaviorResource.prototype.compile = function compile(compiler, resources, node, instruction, parentNode) {
          if (this.liftsContent) {
            if (!instruction.viewFactory) {
              var template = document.createElement('template'),
                  fragment = document.createDocumentFragment(),
                  part = node.getAttribute('part');
 
              node.removeAttribute(instruction.originalAttrName);
 
              if (node.parentNode) {
                node.parentNode.replaceChild(template, node);
              } else if (window.ShadowDOMPolyfill) {
                //HACK: IE template element and shadow dom polyfills not quite right...
                ShadowDOMPolyfill.unwrap(parentNode).replaceChild(ShadowDOMPolyfill.unwrap(template), ShadowDOMPolyfill.unwrap(node));
              } else {
                //HACK: same as above
                parentNode.replaceChild(template, node);
              }
 
              fragment.appendChild(node);
              instruction.viewFactory = compiler.compile(fragment, resources);
 
              if (part) {
                instruction.viewFactory.part = part;
                node.removeAttribute('part');
              }
 
              node = template;
            }
          } else if (this.elementName !== null) {
            //custom element
            var partReplacements = {};
 
            if (!this.skipContentProcessing && node.hasChildNodes()) {
              if (!this.usesShadowDOM) {
                var fragment = document.createDocumentFragment(),
                    currentChild = node.firstChild,
                    nextSibling;
 
                while (currentChild) {
                  nextSibling = currentChild.nextSibling;
 
                  if (currentChild.tagName === 'TEMPLATE' && (toReplace = currentChild.getAttribute('replace-part'))) {
                    partReplacements[toReplace] = compiler.compile(currentChild, resources);
                  } else {
                    fragment.appendChild(currentChild);
                  }
 
                  currentChild = nextSibling;
                }
 
                instruction.contentFactory = compiler.compile(fragment, resources);
              } else {
                var currentChild = node.firstChild,
                    nextSibling,
                    toReplace;
 
                while (currentChild) {
                  nextSibling = currentChild.nextSibling;
 
                  if (currentChild.tagName === 'TEMPLATE' && (toReplace = currentChild.getAttribute('replace-part'))) {
                    partReplacements[toReplace] = compiler.compile(currentChild, resources);
                  }
 
                  currentChild = nextSibling;
                }
              }
            }
          }
 
          instruction.partReplacements = partReplacements;
          instruction.suppressBind = true;
          return node;
        };
 
        HtmlBehaviorResource.prototype.create = function create(container) {
          var instruction = arguments[1] === undefined ? defaultInstruction : arguments[1];
          var element = arguments[2] === undefined ? null : arguments[2];
          var bindings = arguments[3] === undefined ? null : arguments[3];
 
          var executionContext = instruction.executionContext || container.get(this.target),
              behaviorInstance = new BehaviorInstance(this, executionContext, instruction),
              viewFactory,
              host;
 
          if (this.liftsContent) {
            //template controller
            element.primaryBehavior = behaviorInstance;
          } else if (this.elementName !== null) {
            //custom element
            viewFactory = instruction.viewFactory || this.viewFactory;
 
            if (viewFactory) {
              //TODO: apply element instructions? var results = viewFactory.applyElementInstructions(container, behaviorInstance.executionContext, element);
              behaviorInstance.view = viewFactory.create(container, behaviorInstance.executionContext, instruction);
              //TODO: register results with view
            }
 
            if (element) {
              element.primaryBehavior = behaviorInstance;
 
              if (this.usesShadowDOM) {
                host = element.createShadowRoot();
              } else {
                host = element;
              }
 
              if (behaviorInstance.view) {
                if (!this.usesShadowDOM) {
                  if (instruction.contentFactory) {
                    var contentView = instruction.contentFactory.create(container, null, contentSelectorFactoryOptions);
 
                    ContentSelector.applySelectors(contentView, behaviorInstance.view.contentSelectors, function (contentSelector, group) {
                      return contentSelector.add(group);
                    });
 
                    behaviorInstance.contentView = contentView;
                  }
                }
 
                if (instruction.anchorIsContainer) {
                  if (this.childExpression) {
                    behaviorInstance.view.addBinding(this.childExpression.createBinding(host, behaviorInstance.executionContext));
                  }
 
                  behaviorInstance.view.appendNodesTo(host);
                } else {
                  behaviorInstance.view.insertNodesBefore(host);
                }
              } else if (this.childExpression) {
                bindings.push(this.childExpression.createBinding(element, behaviorInstance.executionContext));
              }
            } else if (behaviorInstance.view) {
              //dynamic element with view
              behaviorInstance.view.owner = behaviorInstance;
 
              if (this.childExpression) {
                behaviorInstance.view.addBinding(this.childExpression.createBinding(instruction.host, behaviorInstance.executionContext));
              }
            } else if (this.childExpression) {
              //dynamic element without view
              bindings.push(this.childExpression.createBinding(instruction.host, behaviorInstance.executionContext));
            }
          } else if (this.childExpression) {
            //custom attribute
            bindings.push(this.childExpression.createBinding(element, behaviorInstance.executionContext));
          }
 
          if (element && !(this.apiName in element)) {
            element[this.apiName] = behaviorInstance.executionContext;
          }
 
          return behaviorInstance;
        };
 
        HtmlBehaviorResource.prototype.ensurePropertiesDefined = function ensurePropertiesDefined(instance, lookup) {
          var properties, i, ii, observer;
 
          if ('__propertiesDefined__' in lookup) {
            return;
          }
 
          lookup.__propertiesDefined__ = true;
          properties = this.properties;
 
          for (i = 0, ii = properties.length; i < ii; ++i) {
            observer = properties[i].createObserver(instance);
 
            if (observer !== undefined) {
              lookup[observer.propertyName] = observer;
            }
          }
        };
 
        return HtmlBehaviorResource;
      })();
 
      _export('HtmlBehaviorResource', HtmlBehaviorResource);
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL2h0bWwtYmVoYXZpb3IuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O29JQVVJLGtCQUFrQixFQUNsQiw2QkFBNkIsRUFDN0IsWUFBWSxFQUVILG9CQUFvQjs7Ozs7O2dDQWR6QixNQUFNOzt3Q0FDTixlQUFlOztvQ0FDZixTQUFTOzttQ0FDVCxZQUFZOzsrQkFDWixVQUFVOzt5Q0FDVixlQUFlOzt3QkFDZixTQUFTOzsyQ0FDVCxnQkFBZ0I7OzJDQUNoQixnQkFBZ0I7OztBQUVwQix3QkFBa0IsR0FBRyxFQUFFLFlBQVksRUFBQyxLQUFLLEVBQUU7QUFDM0MsbUNBQTZCLEdBQUcsRUFBRSxZQUFZLEVBQUMsSUFBSSxFQUFFO0FBQ3JELGtCQUFZLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCOztBQUU5QywwQkFBb0I7QUFDcEIsaUJBREEsb0JBQW9CLEdBQ2xCO2dDQURGLG9CQUFvQjs7QUFFN0IsY0FBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDeEIsY0FBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDMUIsY0FBSSxDQUFDLDJCQUEyQixHQUFHLFNBQVMsQ0FBQztBQUM3QyxjQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUMxQixjQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUM3QixjQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0FBQ25DLGNBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0FBQzNCLGNBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQzVCLGNBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDL0IsY0FBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDM0IsY0FBSSxDQUFDLFVB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dkMsY0FBSSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUM7O0FBRWhDLGNBQUcsdUJBQXVCLElBQUksTUFBTSxFQUFDO0FBQ25DLG1CQUFPO1dBQ1I7O0FBRUQsZ0JBQU0sQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7QUFDcEMsb0JBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOztBQUU3QixlQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBQztBQUM3QyxvQkFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRWxELGdCQUFHLFFBQVEsS0FBSyxTQUFTLEVBQUM7QUFDeEIsb0JBQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQzFDO1dBQ0Y7U0FDRjs7ZUFwU1Usb0JBQW9COzs7c0NBQXBCLG9CQUFvQiIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy9odG1sLWJlaGF2aW9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPcmlnaW59IGZyb20gJ2F1cmVsaWEtbWV0YWRhdGEnO1xuaW1wb3J0IHtPYnNlcnZlckxvY2F0b3J9IGZyb20gJ2F1cmVsaWEtYmluZGluZyc7XG5pbXBvcnQge1Rhc2tRdWV1ZX0gZnJvbSAnYXVyZWxpYS10YXNrLXF1ZXVlJztcbmltcG9ydCB7Vmlld1N0cmF0ZWd5fSBmcm9tICcuL3ZpZXctc3RyYXRlZ3knO1xuaW1wb3J0IHtWaWV3RW5naW5lfSBmcm9tICcuL3ZpZXctZW5naW5lJztcbmltcG9ydCB7Q29udGVudFNlbGVjdG9yfSBmcm9tICcuL2NvbnRlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHtoeXBoZW5hdGV9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge0JpbmRhYmxlUHJvcGVydHl9IGZyb20gJy4vYmluZGFibGUtcHJvcGVydHknO1xuaW1wb3J0IHtCZWhhdmlvckluc3RhbmNlfSBmcm9tICcuL2JlaGF2aW9yLWluc3RhbmNlJztcblxudmFyIGRlZmF1bHRJbnN0cnVjdGlvbiA9IHsgc3VwcHJlc3NCaW5kOmZhbHNlIH0sXG4gICAgY29udGVudFNlbGVjdG9yRmFjdG9yeU9wdGlvbnMgPSB7IHN1cHByZXNzQmluZDp0cnVlIH0sXG4gICAgaGFzU2hhZG93RE9NID0gISFIVE1MRWxlbWVudC5wcm90b3R5cGUuY3JlYXRlU2hhZG93Um9vdDtcblxuZXhwb3J0IGNsYXNzIEh0bWxCZWhhdmlvclJlc291cmNlIHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLmVsZW1lbnROYW1lID0gbnVsbDtcbiAgICB0aGlzLmF0dHJpYnV0ZU5hbWUgPSBudWxsO1xuICAgIHRoaXMuYXR0cmlidXRlRGVmYXVsdEJpbmRpbmdNb2RlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMubGlmdHNDb250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy50YXJnZXRTaGFkb3dET00gPSBmYWxzZTtcbiAgICB0aGlzLnNraXBDb250ZW50UHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIHRoaXMudXNlc1NoYWRvd0RPTSA9IGZhbHNlO1xuICAgIHRoaXMuY2hpbGRFeHByZXNzaW9uID0gbnVsbDtcbiAgICB0aGlzLmhhc0R5bmFtaWNPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5jb250YWluZXJsZXNzID0gZmFsc2U7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW107XG4gICAgdGhpcy5hdHRyaWJ1dGVzID0ge307XG4gIH1cblxuICBzdGF0aWMgY29udmVudGlvbihuYW1lLCBleGlzdGluZyl7XG4gICAgdmFyIGJlaGF2aW9yO1xuXG4gICAgaWYobmFtZS5lbmRzV2l0aCgnQ3VzdG9tQXR0cmlidXRlJykpe1xuICAgICAgYmVoYXZpb3IgPSBleGlzdGluZyB8fCBuZXcgSHRtbEJlaGF2aW9yUmVzb3VyY2UoKTtcbiAgICAgIGJlaGF2aW9yLmF0dHJpYnV0ZU5hbWUgPSBoeXBoZW5hdGUobmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgtMTUpKTtcbiAgICB9XG5cbiAgICBpZihuYW1lLmVuZHNXaXRoKCdDdXN0b21FbGVtZW50Jykpe1xuICAgICAgYmVoYXZpb3IgPSBleGlzdGluZyB8fCBuZXcgSHRtbEJlaGF2aW9yUmVzb3VyY2UoKTtcbiAgICAgIGJlaGF2aW9yLmVsZW1lbnROYW1lID0gaHlwaGVuYXRlKG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoLTEzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlaGF2aW9yO1xuICB9XG5cbiAgYW5hbHl6ZShjb250YWluZXIsIHRhcmdldCl7XG4gICAgdmFyIHByb3RvID0gdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgYXR0cmlidXRlTmFtZSA9IHRoaXMuYXR0cmlidXRlTmFtZSxcbiAgICAgICAgYXR0cmlidXRlRGVmYXVsdEJpbmRpbmdNb2RlID0gdGhpcy5hdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGUsXG4gICAgICAgIGksIGlpLCBjdXJyZW50O1xuXG4gICAgdGhpcy5vYnNlcnZlckxvY2F0b3IgPSBjb250YWluZXIuZ2V0KE9ic2VydmVyTG9jYXRvcik7XG4gICAgdGhpcy50YXNrUXVldWUgPSBjb250YWluZXIuZ2V0KFRhc2tRdWV1ZSk7XG5cbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcbiAgICB0aGlzLnVzZXNTaGFkb3dET00gPSB0aGlzLnRhcmdldFNoYWRvd0RPTSAmJiBoYXNTaGFkb3dET007XG4gICAgdGhpcy5oYW5kbGVzQ3JlYXRlZCA9ICgnY3JlYXRlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0JpbmQgPSAoJ2JpbmQnIGluIHByb3RvKTtcbiAgICB0aGlzLmhhbmRsZXNVbmJpbmQgPSAoJ3VuYmluZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0F0dGFjaGVkID0gKCdhdHRhY2hlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuaGFuZGxlc0RldGFjaGVkID0gKCdkZXRhY2hlZCcgaW4gcHJvdG8pO1xuICAgIHRoaXMuYXBpTmFtZSA9ICh0aGlzLmVsZW1lbnROYW1lIHx8IHRoaXMuYXR0cmlidXRlTmFtZSkucmVwbGFjZSgvLShbYS16XSkvZywgKG0sIHcpID0+IHcudG9VcHBlckNhc2UoKSk7XG5cbiAgICBpZihhdHRyaWJ1dGVOYW1lICE9PSBudWxsKXtcbiAgICAgIGlmKHByb3BlcnRpZXMubGVuZ3RoID09PSAwKXsgLy9kZWZhdWx0IGZvciBjdXN0b20gYXR0cmlidXRlc1xuICAgICAgICBuZXcgQmluZGFibGVQcm9wZXJ0eSh7XG4gICAgICAgICAgbmFtZTondmFsdWUnLFxuICAgICAgICAgIGNoYW5nZUhhbmRsZXI6J3ZhbHVlQ2hhbmdlZCcgaW4gcHJvdG8gPyAndmFsdWVDaGFuZ2VkJyA6IG51bGwsXG4gICAgICAgICAgYXR0cmlidXRlOmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgZGVmYXVsdEJpbmRpbmdNb2RlOiBhdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGVcbiAgICAgICAgfSkucmVnaXN0ZXJXaXRoKHRhcmdldCwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnQgPSBwcm9wZXJ0aWVzWzBdO1xuXG4gICAgICBpZihwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMSAmJiBjdXJyZW50Lm5hbWUgPT09ICd2YWx1ZScpeyAvL2RlZmF1bHQgZm9yIGN1c3RvbSBhdHRyaWJ1dGVzXG4gICAgICAgIGN1cnJlbnQuaXNEeW5hbWljID0gY3VycmVudC5oYXNPcHRpb25zID0gdGhpcy5oYXNEeW5hbWljT3B0aW9ucztcbiAgICAgICAgY3VycmVudC5kZWZpbmVPbih0YXJnZXQsIHRoaXMpO1xuICAgICAgfSBlbHNleyAvL2N1c3RvbSBhdHRyaWJ1dGUgd2l0aCBvcHRpb25zXG4gICAgICAgIGZvcihpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgICAgIHByb3BlcnRpZXNbaV0uZGVmaW5lT24odGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPSBuZXcgQmluZGFibGVQcm9wZXJ0eSh7XG4gICAgICAgICAgbmFtZTondmFsdWUnLFxuICAgICAgICAgIGNoYW5nZUhhbmRsZXI6J3ZhbHVlQ2hhbmdlZCcgaW4gcHJvdG8gPyAndmFsdWVDaGFuZ2VkJyA6IG51bGwsXG4gICAgICAgICAgYXR0cmlidXRlOmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgZGVmYXVsdEJpbmRpbmdNb2RlOiBhdHRyaWJ1dGVEZWZhdWx0QmluZGluZ01vZGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3VycmVudC5oYXNPcHRpb25zID0gdHJ1ZTtcbiAgICAgICAgY3VycmVudC5yZWdpc3RlcldpdGgodGFyZ2V0LCB0aGlzKTtcbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIGZvcihpID0gMCwgaWkgPSBwcm9wZXJ0aWVzLmxlbmd0aDsgaSA8IGlpOyArK2kpe1xuICAgICAgICBwcm9wZXJ0aWVzW2ldLmRlZmluZU9uKHRhcmdldCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZChjb250YWluZXIsIHRhcmdldCwgdmlld1N0cmF0ZWd5LCB0cmFuc2llbnRWaWV3KXtcbiAgICB2YXIgb3B0aW9ucztcblxuICAgIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpe1xuICAgICAgdmlld1N0cmF0ZWd5ID0gdmlld1N0cmF0ZWd5IHx8IHRoaXMudmlld1N0cmF0ZWd5IHx8IFZpZXdTdHJhdGVneS5nZXREZWZhdWx0KHRhcmdldCk7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICB0YXJnZXRTaGFkb3dET006dGhpcy50YXJnZXRTaGFkb3dET00sXG4gICAgICAgIGJlZm9yZUNvbXBpbGU6dGFyZ2V0LmJlZm9yZUNvbXBpbGVcbiAgICAgIH07XG5cbiAgICAgIGlmKCF2aWV3U3RyYXRlZ3kubW9kdWxlSWQpe1xuICAgICAgICB2aWV3U3RyYXRlZ3kubW9kdWxlSWQgPSBPcmlnaW4uZ2V0KHRhcmdldCkubW9kdWxlSWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2aWV3U3RyYXRlZ3kubG9hZFZpZXdGYWN0b3J5KGNvbnRhaW5lci5nZXQoVmlld0VuZ2luZSksIG9wdGlvbnMpLnRoZW4odmlld0ZhY3RvcnkgPT4ge1xuICAgICAgICBpZighdHJhbnNpZW50Vmlldyl7XG4gICAgICAgICAgdGhpcy52aWV3RmFjdG9yeSA9IHZpZXdGYWN0b3J5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZpZXdGYWN0b3J5O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgfVxuXG4gIHJlZ2lzdGVyKHJlZ2lzdHJ5LCBuYW1lKXtcbiAgICBpZih0aGlzLmF0dHJpYnV0ZU5hbWUgIT09IG51bGwpIHtcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyQXR0cmlidXRlKG5hbWUgfHwgdGhpcy5hdHRyaWJ1dGVOYW1lLCB0aGlzLCB0aGlzLmF0dHJpYnV0ZU5hbWUpO1xuICAgIH1cblxuICAgIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpIHtcbiAgICAgIHJlZ2lzdHJ5LnJlZ2lzdGVyRWxlbWVudChuYW1lIHx8IHRoaXMuZWxlbWVudE5hbWUsIHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGUoY29tcGlsZXIsIHJlc291cmNlcywgbm9kZSwgaW5zdHJ1Y3Rpb24sIHBhcmVudE5vZGUpe1xuICAgIGlmKHRoaXMubGlmdHNDb250ZW50KXtcbiAgICAgIGlmKCFpbnN0cnVjdGlvbi52aWV3RmFjdG9yeSl7XG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyksXG4gICAgICAgICAgICBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgIHBhcnQgPSBub2RlLmdldEF0dHJpYnV0ZSgncGFydCcpO1xuXG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGluc3RydWN0aW9uLm9yaWdpbmFsQXR0ck5hbWUpO1xuXG4gICAgICAgIGlmKG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0ZW1wbGF0ZSwgbm9kZSk7XG4gICAgICAgIH1lbHNlIGlmKHdpbmRvdy5TaGFkb3dET01Qb2x5ZmlsbCl7IC8vSEFDSzogSUUgdGVtcGxhdGUgZWxlbWVudCBhbmQgc2hhZG93IGRvbSBwb2x5ZmlsbHMgbm90IHF1aXRlIHJpZ2h0Li4uXG4gICAgICAgICAgU2hhZG93RE9NUG9seWZpbGwudW53cmFwKHBhcmVudE5vZGUpLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgIFNoYWRvd0RPTVBvbHlmaWxsLnVud3JhcCh0ZW1wbGF0ZSksXG4gICAgICAgICAgICBTaGFkb3dET01Qb2x5ZmlsbC51bndyYXAobm9kZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1lbHNleyAvL0hBQ0s6IHNhbWUgYXMgYWJvdmVcbiAgICAgICAgICBwYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0ZW1wbGF0ZSwgbm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udmlld0ZhY3RvcnkgPSBjb21waWxlci5jb21waWxlKGZyYWdtZW50LCByZXNvdXJjZXMpO1xuXG4gICAgICAgIGlmKHBhcnQpe1xuICAgICAgICAgIGluc3RydWN0aW9uLnZpZXdGYWN0b3J5LnBhcnQgPSBwYXJ0O1xuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdwYXJ0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBub2RlID0gdGVtcGxhdGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKHRoaXMuZWxlbWVudE5hbWUgIT09IG51bGwpeyAvL2N1c3RvbSBlbGVtZW50XG4gICAgICB2YXIgcGFydFJlcGxhY2VtZW50cyA9IHt9O1xuXG4gICAgICBpZighdGhpcy5za2lwQ29udGVudFByb2Nlc3NpbmcgJiYgbm9kZS5oYXNDaGlsZE5vZGVzKCkpe1xuICAgICAgICBpZighdGhpcy51c2VzU2hhZG93RE9NKXtcbiAgICAgICAgICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICB3aGlsZSAoY3VycmVudENoaWxkKSB7XG4gICAgICAgICAgICBuZXh0U2libGluZyA9IGN1cnJlbnRDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgaWYoY3VycmVudENoaWxkLnRhZ05hbWUgPT09ICdURU1QTEFURScgJiYgKHRvUmVwbGFjZSA9IGN1cnJlbnRDaGlsZC5nZXRBdHRyaWJ1dGUoJ3JlcGxhY2UtcGFydCcpKSl7XG4gICAgICAgICAgICAgIHBhcnRSZXBsYWNlbWVudHNbdG9SZXBsYWNlXSA9IGNvbXBpbGVyLmNvbXBpbGUoY3VycmVudENoaWxkLCByZXNvdXJjZXMpO1xuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGN1cnJlbnRDaGlsZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluc3RydWN0aW9uLmNvbnRlbnRGYWN0b3J5ID0gY29tcGlsZXIuY29tcGlsZShmcmFnbWVudCwgcmVzb3VyY2VzKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgdmFyIGN1cnJlbnRDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgbmV4dFNpYmxpbmcsIHRvUmVwbGFjZTtcblxuICAgICAgICAgIHdoaWxlIChjdXJyZW50Q2hpbGQpIHtcbiAgICAgICAgICAgIG5leHRTaWJsaW5nID0gY3VycmVudENoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBpZihjdXJyZW50Q2hpbGQudGFnTmFtZSA9PT0gJ1RFTVBMQVRFJyAmJiAodG9SZXBsYWNlID0gY3VycmVudENoaWxkLmdldEF0dHJpYnV0ZSgncmVwbGFjZS1wYXJ0JykpKXtcbiAgICAgICAgICAgICAgcGFydFJlcGxhY2VtZW50c1t0b1JlcGxhY2VdID0gY29tcGlsZXIuY29tcGlsZShjdXJyZW50Q2hpbGQsIHJlc291cmNlcyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGN1cnJlbnRDaGlsZCA9IG5leHRTaWJsaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGluc3RydWN0aW9uLnBhcnRSZXBsYWNlbWVudHMgPSBwYXJ0UmVwbGFjZW1lbnRzO1xuICAgIGluc3RydWN0aW9uLnN1cHByZXNzQmluZCA9IHRydWU7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBjcmVhdGUoY29udGFpbmVyLCBpbnN0cnVjdGlvbj1kZWZhdWx0SW5zdHJ1Y3Rpb24sIGVsZW1lbnQ9bnVsbCwgYmluZGluZ3M9bnVsbCl7XG4gICAgdmFyIGV4ZWN1dGlvbkNvbnRleHQgPSBpbnN0cnVjdGlvbi5leGVjdXRpb25Db250ZXh0IHx8IGNvbnRhaW5lci5nZXQodGhpcy50YXJnZXQpLFxuICAgICAgICBiZWhhdmlvckluc3RhbmNlID0gbmV3IEJlaGF2aW9ySW5zdGFuY2UodGhpcywgZXhlY3V0aW9uQ29udGV4dCwgaW5zdHJ1Y3Rpb24pLFxuICAgICAgICB2aWV3RmFjdG9yeSwgaG9zdDtcblxuICAgIGlmKHRoaXMubGlmdHNDb250ZW50KXtcbiAgICAgIC8vdGVtcGxhdGUgY29udHJvbGxlclxuICAgICAgZWxlbWVudC5wcmltYXJ5QmVoYXZpb3IgPSBiZWhhdmlvckluc3RhbmNlO1xuICAgIH0gZWxzZSBpZih0aGlzLmVsZW1lbnROYW1lICE9PSBudWxsKXtcbiAgICAgIC8vY3VzdG9tIGVsZW1lbnRcbiAgICAgIHZpZXdGYWN0b3J5ID0gaW5zdHJ1Y3Rpb24udmlld0ZhY3RvcnkgfHwgdGhpcy52aWV3RmFjdG9yeTtcblxuICAgICAgaWYodmlld0ZhY3Rvcnkpe1xuICAgICAgICAvL1RPRE86IGFwcGx5IGVsZW1lbnQgaW5zdHJ1Y3Rpb25zPyB2YXIgcmVzdWx0cyA9IHZpZXdGYWN0b3J5LmFwcGx5RWxlbWVudEluc3RydWN0aW9ucyhjb250YWluZXIsIGJlaGF2aW9ySW5zdGFuY2UuZXhlY3V0aW9uQ29udGV4dCwgZWxlbWVudCk7XG4gICAgICAgIGJlaGF2aW9ySW5zdGFuY2UudmlldyA9IHZpZXdGYWN0b3J5LmNyZWF0ZShjb250YWluZXIsIGJlaGF2aW9ySW5zdGFuY2UuZXhlY3V0aW9uQ29udGV4dCwgaW5zdHJ1Y3Rpb24pO1xuICAgICAgICAvL1RPRE86IHJlZ2lzdGVyIHJlc3VsdHMgd2l0aCB2aWV3XG4gICAgICB9XG5cbiAgICAgIGlmKGVsZW1lbnQpe1xuICAgICAgICBlbGVtZW50LnByaW1hcnlCZWhhdmlvciA9IGJlaGF2aW9ySW5zdGFuY2U7XG5cbiAgICAgICAgaWYodGhpcy51c2VzU2hhZG93RE9NKSB7XG4gICAgICAgICAgaG9zdCA9IGVsZW1lbnQuY3JlYXRlU2hhZG93Um9vdCgpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICBob3N0ID0gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKGJlaGF2aW9ySW5zdGFuY2Uudmlldyl7XG4gICAgICAgICAgaWYoIXRoaXMudXNlc1NoYWRvd0RPTSkge1xuICAgICAgICAgICAgaWYoaW5zdHJ1Y3Rpb24uY29udGVudEZhY3Rvcnkpe1xuICAgICAgICAgICAgICB2YXIgY29udGVudFZpZXcgPSBpbnN0cnVjdGlvbi5jb250ZW50RmFjdG9yeS5jcmVhdGUoY29udGFpbmVyLCBudWxsLCBjb250ZW50U2VsZWN0b3JGYWN0b3J5T3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgQ29udGVudFNlbGVjdG9yLmFwcGx5U2VsZWN0b3JzKFxuICAgICAgICAgICAgICAgIGNvbnRlbnRWaWV3LFxuICAgICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5jb250ZW50U2VsZWN0b3JzLFxuICAgICAgICAgICAgICAgIChjb250ZW50U2VsZWN0b3IsIGdyb3VwKSA9PiBjb250ZW50U2VsZWN0b3IuYWRkKGdyb3VwKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2UuY29udGVudFZpZXcgPSBjb250ZW50VmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZihpbnN0cnVjdGlvbi5hbmNob3JJc0NvbnRhaW5lcil7XG4gICAgICAgICAgICBpZih0aGlzLmNoaWxkRXhwcmVzc2lvbil7XG4gICAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hZGRCaW5kaW5nKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoaG9zdCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hcHBlbmROb2Rlc1RvKGhvc3QpO1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgYmVoYXZpb3JJbnN0YW5jZS52aWV3Lmluc2VydE5vZGVzQmVmb3JlKGhvc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgICAgIGJpbmRpbmdzLnB1c2godGhpcy5jaGlsZEV4cHJlc3Npb24uY3JlYXRlQmluZGluZyhlbGVtZW50LCBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQpKTtcbiAgICAgICAgfVxuICAgICAgfWVsc2UgaWYoYmVoYXZpb3JJbnN0YW5jZS52aWV3KXtcbiAgICAgICAgLy9keW5hbWljIGVsZW1lbnQgd2l0aCB2aWV3XG4gICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5vd25lciA9IGJlaGF2aW9ySW5zdGFuY2U7XG5cbiAgICAgICAgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgICAgIGJlaGF2aW9ySW5zdGFuY2Uudmlldy5hZGRCaW5kaW5nKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoaW5zdHJ1Y3Rpb24uaG9zdCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgICAgIH1cbiAgICAgIH1lbHNlIGlmKHRoaXMuY2hpbGRFeHByZXNzaW9uKXtcbiAgICAgICAgLy9keW5hbWljIGVsZW1lbnQgd2l0aG91dCB2aWV3XG4gICAgICAgIGJpbmRpbmdzLnB1c2godGhpcy5jaGlsZEV4cHJlc3Npb24uY3JlYXRlQmluZGluZyhpbnN0cnVjdGlvbi5ob3N0LCBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodGhpcy5jaGlsZEV4cHJlc3Npb24pe1xuICAgICAgLy9jdXN0b20gYXR0cmlidXRlXG4gICAgICBiaW5kaW5ncy5wdXNoKHRoaXMuY2hpbGRFeHByZXNzaW9uLmNyZWF0ZUJpbmRpbmcoZWxlbWVudCwgYmVoYXZpb3JJbnN0YW5jZS5leGVjdXRpb25Db250ZXh0KSk7XG4gICAgfVxuXG4gICAgaWYoZWxlbWVudCAmJiAhKHRoaXMuYXBpTmFtZSBpbiBlbGVtZW50KSl7XG4gICAgICBlbGVtZW50W3RoaXMuYXBpTmFtZV0gPSBiZWhhdmlvckluc3RhbmNlLmV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJlaGF2aW9ySW5zdGFuY2U7XG4gIH1cblxuICBlbnN1cmVQcm9wZXJ0aWVzRGVmaW5lZChpbnN0YW5jZSwgbG9va3VwKXtcbiAgICB2YXIgcHJvcGVydGllcywgaSwgaWksIG9ic2VydmVyO1xuXG4gICAgaWYoJ19fcHJvcGVydGllc0RlZmluZWRfXycgaW4gbG9va3VwKXtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb29rdXAuX19wcm9wZXJ0aWVzRGVmaW5lZF9fID0gdHJ1ZTtcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xuXG4gICAgZm9yKGkgPSAwLCBpaSA9IHByb3BlcnRpZXMubGVuZ3RoOyBpIDwgaWk7ICsraSl7XG4gICAgICBvYnNlcnZlciA9IHByb3BlcnRpZXNbaV0uY3JlYXRlT2JzZXJ2ZXIoaW5zdGFuY2UpO1xuXG4gICAgICBpZihvYnNlcnZlciAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgbG9va3VwW29ic2VydmVyLnByb3BlcnR5TmFtZV0gPSBvYnNlcnZlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==